print("对象信息##################################################start")
# 基本类型都可以用type()判断
print(type(123))
print(type("wx"))
print(type(123) == type(456))
print(type(123) == int)
print(type("wx") == type("wxx"))
print(type("wx") == str)


# 如果一个变量指向函数或者类，也可以用type()判断
class A(object):
    pass


print(type(abs))
print(type(A()))
a = A()
print(type(a))
print(type(a) == A)

# 判断一个对象是否是函数怎可以使用types模块中定义的常量
import types


def f():
    pass


print(type(f) == types.FunctionType)
print(type(abs) == types.BuiltinFunctionType)
print(type(lambda x: x) == types.LambdaType)
print(type((x for x in range(10))) == types.GeneratorType)

#  isinstance()就可以告诉我们，一个对象是否是某种类型(包含父子类型)
print(isinstance('a', str))
print(isinstance(123, int))
print(isinstance(b'a', bytes))

# 并且还可以判断一个变量是否是某些类型中的一种，比如下面的代码就可以判断是否是list或者tuple
print(isinstance([1, 2, 3], (list, tuple)))
print(isinstance((1, 2, 3), (list, tuple)))


# dir()获取所有对象属性 hasattr()验证这个对象没有指定属性 setattr()给对象设置指定属性
#  getattr()获取对象指定属性
class MyObject(object):
    def __init__(self):
        self.x = 9

    def power(self):
        return self.x * self.x


myObjet = MyObject()
print(dir(myObjet))
print(hasattr(myObjet, 'x'))  # 有属性'x'吗？
print(hasattr(myObjet, 'y'))  # 有属性'y'吗？
setattr(myObjet, 'y', 19)  # 设置一个属性'y'
print(hasattr(myObjet, 'y'))  # 有属性'y'吗？
print(getattr(myObjet, 'y'))  # 获取属性'y'
print(myObjet.y)
print(getattr(myObjet, 'z', "z不存在"))  # 如果属性不存在，就返回默认值
print(hasattr(myObjet, 'power'))  # 有'power函数'吗？
print(getattr(myObjet, 'power'))  # 获取函数'power'
f = getattr(myObjet, 'power')
print(f())
print("对象信息##################################################end\n")
